Skip to content

《C语言程序设计》第一学期重修试卷B (精选07)

一、单项选择题(本大题共10小题,每小题2分,共20分)

(1) 属于C语言基本数据类型的是(B)。

A. 指针型
B. 无符号整型
C. 数组型
D. 结构型

查看答案与解析

答案:B

解析: C 语言基本数据类型包括:char、short、int、long、float、double,以及它们的无符号版本(unsigned)。指针、数组、结构体属于派生类型或构造类型。


难度: ⭐
考点: #数据类型

💡 学习锦囊

📖 相关公式与知识点:

  • 基本类型:整型(signed/unsigned)、浮点型(float/double)、字符型(char)。
  • 派生类型:指针、数组、函数。
  • 构造类型:结构体、共用体、枚举。

思路分析

区分基本类型和构造类型。

🔄 举一反三
  1. 数组型属于什么类型?
    查看练习答案与解析

    答案:构造类型(派生类型) 解析:数组由基本类型元素组成,属于构造类型。

(2) 以下用户标识符中,合法的是(B)。

A. int
B. nit
C. 123
D. a+b

查看答案与解析

答案:B

解析: A 是关键字,不能作为标识符。C 是数字开头,不合法。D 包含 +,不合法。B 合法。


难度: ⭐
考点: #标识符

💡 学习锦囊

📖 相关公式与知识点:

  • 标识符规则:字母/下划线开头,后续可为字母、数字、下划线。
  • 关键字不能作为标识符。

思路分析

记住关键字和标识符规则。

🔄 举一反三
  1. _123 是合法的标识符吗?
    查看练习答案与解析

    答案:是 解析:下划线开头,后续为数字,符合标识符规则。

(3) 以下不正确的语句(设有 int p, q)是(D)。

A. p *= 3;
B. p /= q;
C. p += 3;
D. p &&= q;

查看答案与解析

答案:D

解析: C 语言中没有 &&= 这种复合赋值运算符。+=-=*=/=%= 等是合法的,但逻辑运算符没有复合赋值形式。


难度: ⭐
考点: #赋值运算符

💡 学习锦囊

📖 相关公式与知识点:

  • 复合赋值运算符:+=-=*=/=%=&=|=^=<<=>>=
  • 没有 &&=||=

思路分析

记住合法的复合赋值运算符。

🔄 举一反三
  1. p |= q 等价于什么?
    查看练习答案与解析

    答案p = p | q解析|= 是按位或的复合赋值运算符。

(4) 以下程序中,while 循环的循环次数是(D)。

c
main()
{
    int i = 0;
    while (i < 10)
    {
        if (i < 1)
            continue;
        if (i == 5)
            break;
        i++;
    }
}

A. 1
B. 10
C. 6
D. 死循环

查看答案与解析

答案:D

解析: 初始 i=0,进入循环。i < 1 为真,执行 continue,跳过 i++,回到 while 条件。i 始终为 0,死循环。


难度: ⭐⭐⭐
考点: #continue #死循环

💡 学习锦囊

📖 相关公式与知识点:

  • continue 跳过循环体剩余部分,回到条件判断。
  • 注意 continue 可能跳过循环变量的更新。

易错点

continue 会跳过循环变量更新,可能导致死循环。

🔄 举一反三
  1. 若将 if (i < 1) continue; 改为 if (i < 1) i++;,循环次数是多少?
    查看练习答案与解析

    答案:10 次 解析:i 从 0 到 9,每次 i++ 正常递增,循环 10 次后 i=10 退出。

(5) 以下程序的输出结果是(A)。

c
main()
{
    int a = 0, i;
    for (i = 1; i < 5; i++)
    {
        switch (i)
        {
            case 0:
            case 3: a += 2;
            case 1:
            case 2: a += 3;
            default: a += 5;
        }
    }
    printf("%d\n", a);
}

A. 31
B. 13
C. 10
D. 20

查看答案与解析

答案:A

解析: 没有 break,发生穿透:

  • i=1:case 1 → case 2 → default,a += 3 + 5 = 8
  • i=2:case 2 → default,a += 3 + 5 = 16
  • i=3:case 3 → case 1 → case 2 → default,a += 2 + 3 + 5 = 26
  • i=4:default,a += 5 = 31

输出 31。


难度: ⭐⭐⭐
考点: #switch穿透

💡 学习锦囊

📖 相关公式与知识点:

  • switch 穿透:匹配后无 break 则继续执行后续 case。

易错点

注意 case 的排列顺序和穿透效果。

🔄 举一反三
  1. 若在每个 case 后都加上 break;,a 的最终值是多少?
    查看练习答案与解析

    答案:13

解析:i=1→case1→a+=3=3, break; i=2→case2→a+=3=6, break; i=3→case3→a+=2=8, break; i=4→default→a+=5=13。 :::

(6) 以下程序段的输出结果是(C)。

c
main()
{
    int n = 2;
    while (n--);
    printf("%d\n", n);
}

A. 2
B. 1
C. -1
D. 0

查看答案与解析

答案:C

解析:n-- 先用后减:

  • n=2:条件为真,n 变为 1
  • n=1:条件为真,n 变为 0
  • n=0:条件为假(0),但 n-- 仍会执行,n 变为 -1

循环结束,输出 n = -1。


难度: ⭐⭐⭐
考点: #自增自减 #while循环

💡 学习锦囊

📖 相关公式与知识点:

  • n-- 作为条件:先判断 n 的值,再自减。
  • 即使条件为假(n=0),n-- 仍会执行。

思路分析

注意后缀自减在条件中的行为。

🔄 举一反三
  1. 若将 while (n--) 改为 while (--n),输出是多少?
    查看练习答案与解析

    答案:0

解析:n=2→--n=1 真; n=1→--n=0 假,循环结束,n=0。 :::

(7) 以下函数调用语句中含有实参个数为(A)。

c
func((exp1, exp2), (exp3, exp4, exp5));

A. 2
B. 5
C. 1
D. 3

查看答案与解析

答案:A

解析: 实参是两个逗号表达式:

  • (exp1, exp2):值为 exp2
  • (exp3, exp4, exp5):值为 exp5

共 2 个实参。


难度: ⭐⭐
考点: #逗号表达式

💡 学习锦囊

📖 相关公式与知识点:

  • 逗号表达式:(a, b, c) 的值为最后一个表达式的值(c)。
  • 逗号表达式作为函数参数时,整体算作一个参数。

思路分析

注意区分逗号表达式和参数分隔符。

🔄 举一反三
  1. int x = (1, 2, 3); 后 x 的值是多少?
    查看练习答案与解析

    答案:3 解析:逗号表达式取最后一个值。

(8) 以下程序的运行结果是(D)。

c
main()
{
    int a = 1, b = 2, c = 3;
    printf("%d\n", c > b > a);
}

A. 2
B. 3
C. 0
D. 1

查看答案与解析

答案:C(0)

解析:c > b > a 等价于 (c > b) > a = (3 > 2) > 1 = 1 > 1 = 0。

注意:不能连续比较,C 语言中 c > b > a 不是数学中的连比。


难度: ⭐⭐⭐
考点: #关系运算

💡 学习锦囊

📖 相关公式与知识点:

  • 关系运算符是左结合的。
  • a > b > c 等价于 (a > b) > c,不是数学中的 a > b 且 b > c。

易错点

C 语言不能连写关系表达式,必须用逻辑运算符连接。

🔄 举一反三
  1. 如何正确表达 a > b > c 的数学含义?
    查看练习答案与解析

    答案a > b && b > c解析:用逻辑与连接两个关系表达式。

(9) 以下程序的运行结果是(B)。

c
main()
{
    int a = 5, b = 4, c = 6, d;
    printf("%d\n", d = a > b ? (a > c ? a : c) : (b));
}

A. 5
B. 6
C. 4
D. 不确定

查看答案与解析

答案:B

解析: 嵌套条件表达式:

  • a > b = 5 > 4 = 真
  • 执行 a > c ? a : c = 5 > 6 ? 5 : 6 = 6
  • d = 6

难度: ⭐⭐
考点: #条件表达式

💡 学习锦囊

📖 相关公式与知识点:

  • 条件表达式:条件 ? 表达式1 : 表达式2
  • 可以嵌套使用。

思路分析

从内向外分析嵌套条件表达式。

🔄 举一反三
  1. int max = a > b ? a : b; 的功能是什么?
    查看练习答案与解析

    答案:求 a 和 b 的最大值 解析:条件表达式常用于求最值。

(10) 以下程序的运行结果是(C)。

c
main()
{
    int a = 0, b = 0, c = 0;
    if (++a > 0 || ++b > 0)
        ++c;
    printf("%d,%d,%d\n", a, b, c);
}

A. 0,0,0
B. 1,1,1
C. 1,0,1
D. 0,1,1

查看答案与解析

答案:C

解析:++a > 0 = 1 > 0 = 真。由于 || 短路求值,右边 ++b > 0 不执行,b 保持 0。然后 ++c,c = 1。

结果:a=1, b=0, c=1


难度: ⭐⭐⭐
考点: #短路求值

💡 学习锦囊

📖 相关公式与知识点:

  • || 短路:左边为真,右边不执行。
  • && 短路:左边为假,右边不执行。

易错点

短路求值可能导致某些表达式不被执行。

🔄 举一反三
  1. 若将 || 改为 &&,输出是什么?
    查看练习答案与解析

    答案:1,1,1 解析++a > 0=1 真,不短路,++b > 0=1 真,++c,a=1,b=1,c=1。

二、填空题(本大题共10空,每空2分,共20分)

(1) C 语言表达式 5 > 2 > 7 > 8 的值是 0

查看答案与解析

答案: 0

解析:5 > 2 > 7 > 8 = ((5 > 2) > 7) > 8 = (1 > 7) > 8 = 0 > 8 = 0。


难度: ⭐⭐
考点: #关系运算

💡 学习锦囊

📖 相关公式与知识点:

  • 关系运算符左结合。
  • 结果只有 0 或 1。

思路分析

不要按数学直觉理解连比。

🔄 举一反三
  1. 3 > 2 > 1 的值是多少?
    查看练习答案与解析

    答案:0 解析(3 > 2) > 1 = 1 > 1 = 0。

(2) 以下程序的输出结果是 1

c
main()
{
    int x = 2, y = -1, z = 2;
    if (x < y)
        if (y < 0)
            z = 0;
        else
            z = z + 1;
    printf("%d\n", z);
}
查看答案与解析

答案: 2(z 不变)

解析:x < y = 2 < -1 = 假,所以内层 if 不执行,z 保持 2。

注意:else 与最近的 if 配对。


难度: ⭐⭐
考点: #if嵌套 #else配对

💡 学习锦囊

📖 相关公式与知识点:

  • else 与最近的未配对的 if 配对。
  • 可以用花括号改变配对关系。

思路分析

注意 else 的配对规则。

🔄 举一反三
  1. 若用花括号将内层 if-else 包裹,输出是多少?
    查看练习答案与解析

    答案:2(不变) 解析:花括号不影响外层 if 的条件判断,x < y 仍为假。

(3) 以下程序的输出结果是 10

c
main()
{
    int i;
    for (i = 1; i <= 5; i++)
        ;
    printf("%d\n", i);
}
查看答案与解析

答案: 6

解析: 循环体是空语句(分号)。i 从 1 到 5,每次加 1。当 i=6 时,条件 i <= 5 为假,循环结束。输出 i = 6。


难度: ⭐⭐
考点: #for循环 #空语句

💡 学习锦囊

📖 相关公式与知识点:

  • for 循环体可以是空语句(只有一个分号)。
  • 注意循环结束后循环变量的值。

易错点

不要忽略空语句,它也是一个完整的循环体。

🔄 举一反三
  1. 若 for 循环体不是空语句而是 printf("%d ", i);,输出是什么?
    查看练习答案与解析

    答案:1 2 3 4 5 6 解析:循环体执行 5 次输出 1-5,循环结束后输出 i=6。

(4) 以下程序段的输出结果是 9

c
int k, n, m;
n = 10; m = 1; k = 1;
while (k++ <= n)
    m *= 2;
printf("%d\n", m);
查看答案与解析

答案: 1024

解析:k++ <= n

  • k=1:1<=10 真,k=2,m=2
  • k=2:2<=10 真,k=3,m=4
  • ...
  • k=10:10<=10 真,k=11,m=1024
  • k=11:11<=10 假,结束

m = 2^10 = 1024。


难度: ⭐⭐
考点: #while循环 #自增

💡 学习锦囊

📖 相关公式与知识点:

  • k++ <= n:先比较,后自增。

思路分析

注意 k++ 在条件中的行为。

🔄 举一反三
  1. 若将 k++ <= n 改为 ++k <= n,m 的值是多少?
    查看练习答案与解析

    答案:512 解析:k 从 2 到 10 共 9 次循环,m = 2^9 = 512。

(5) 以下程序段的输出结果是 4

c
int x = 2;
do
{
    printf("*");
    x--;
} while (!x == 0);
查看答案与解析

答案: **(2个*)

解析:

  • 第一次:输出 *,x=1。!x == 0 = !1 == 0 = 0 == 0 = 真,继续。
  • 第二次:输出 *,x=0。!x == 0 = !0 == 0 = 1 == 0 = 假,结束。

输出 **


难度: ⭐⭐⭐
考点: #do-while #逻辑运算

💡 学习锦囊

📖 相关公式与知识点:

  • ! 优先级高于 ==
  • !x == 0 等价于 (!x) == 0

思路分析

注意运算符优先级。

🔄 举一反三
  1. 若将 !x == 0 改为 !x = 0,会怎样?
    查看练习答案与解析

    答案:编译错误 解析!x 是右值,不能被赋值。

(6) 以下程序段的输出结果是 2

c
int i, j, x = 0;
for (i = 0; i < 2; i++)
{
    x++;
    for (j = 0; j <= 3; j++)
    {
        if (j % 2)
            continue;
        x++;
    }
    x++;
}
printf("x=%d\n", x);
查看答案与解析

答案: x=8

解析: 外层循环 2 次,每次:

  • x++:x=1
  • 内层 j=0,1,2,3:
    • j=0:0%2=0,不 continue,x=2
    • j=1:1%2=1,continue,跳过 x++
    • j=2:2%2=0,不 continue,x=3
    • j=3:3%2=1,continue,跳过 x++
  • x++:x=4

第二次外层循环:x=8


难度: ⭐⭐⭐
考点: #嵌套循环 #continue

💡 学习锦囊

📖 相关公式与知识点:

  • continue 只影响所在的最内层循环。

思路分析

逐层追踪循环变量。

🔄 举一反三
  1. 若将内层 if (j % 2) continue; 改为 if (j % 2 == 0) continue;,x 的值是多少?
    查看练习答案与解析

    答案:x=8 解析:j=0,2 时 continue,j=1,3 时 x++,每轮内层 x 加 2,结果相同。

三、程序分析题(本大题共4小题,每小题5分,共20分)

(1) 以下程序的运行结果是 200,100,100,200

c
int a1 = 100, a2 = 200;
main()
{
    int a3 = 100, a4 = 200;
    sub1(a3, a4);
    sub1(a1, a2);
    printf("%d,%d,%d,%d\n", a1, a2, a3, a4);
}
sub1(int x, int y)
{
    a1 = x;
    x = y;
    y = a1;
}
查看答案与解析

答案: 100,200,100,200

解析: sub1 是值传递,x 和 y 的改变不影响实参。

  • sub1(a3, a4):a1 = 100(全局变量),x 和 y 交换不影响 a3, a4。
  • sub1(a1, a2):a1 = 100(不变),x 和 y 交换不影响 a1, a2。

最终:a1=100, a2=200, a3=100, a4=200。


难度: ⭐⭐⭐
考点: #全局变量 #值传递

💡 学习锦囊

📖 相关公式与知识点:

  • 值传递不改变实参。
  • 全局变量在所有函数中可见。

思路分析

注意区分全局变量和局部变量,以及值传递的效果。

🔄 举一反三
  1. 若 sub1 的参数改为指针 int *x, int *y,输出是什么?
    查看练习答案与解析

    答案:200,100,200,100 解析:指针传递会修改实参的值。

(2) 以下程序的运行结果是 5

c
main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int *p = a;
    printf("%d\n", *(p + 4));
}
查看答案与解析

答案: 5

解析: p 指向数组首元素,p + 4 指向第 5 个元素(下标 4),即 a[4] = 5。


难度: ⭐
考点: #指针运算

💡 学习锦囊

📖 相关公式与知识点:

  • p + n 指向第 n 个元素(不是第 n 个字节)。

思路分析

指针加减按元素大小偏移。

🔄 举一反三
  1. int *p = &a[2];*(p - 1) 的值是多少?
    查看练习答案与解析

    答案:2 解析:p 指向 a[2]=3,p-1 指向 a[1]=2。

四、程序填充题(本大题共3小题,每小题6分,共18分)

(1) 将十个整数输入数组,求出其平均值并输出。

c
main()
{
    int i, a[10], sum = 0;
    float *p = a;  /* 第一空:应为 float avg; 或调整类型 */
    /* 正确写法: */
    int *p = a;  /* 第一空 */
    for (i = 0; i < 10; i++)
    {
        scanf("%d", p + i);  /* 或用 &a[i] */
        sum += *(p + i);  /* 第二空 */
    }
    printf("%8.2f\n", (float)sum / 10);  /* 第三空 */
}
查看答案与解析

答案:

  • 第一空:a&a[0](p 的初始化)
  • 第二空:*pa[i](累加)
  • 第三空:(float)sum / 10(平均值)

解析: 用指针遍历数组,计算平均值。注意类型转换,确保得到浮点结果。


难度: ⭐⭐
考点: #指针 #数组 #平均值

💡 学习锦囊

📖 相关公式与知识点:

  • 指针遍历数组:p + ip++
  • 平均值 = 总和 / 个数,注意类型转换。

思路分析

确保平均值计算时进行浮点除法。

🔄 举一反三
  1. 若数组有 n 个元素,如何用指针计算平均值?
    查看练习答案与解析

    答案for (p = a; p < a + n; p++) sum += *p; avg = (float)sum / n;解析:指针遍历数组,注意类型转换。

(2) 输入一个无符号整数后求出它的各位数之和并输出。

例如若输入 123,则将各位之和 6(即 1+2+3)输出。

c
unsigned int f(unsigned int num)  /* 第一空 */
{
    unsigned int k = 0;
    do
    {
        k += num % 10;  /* 第二空 */
        num /= 10;
    } while (num);  /* 第三空 */
    return k;
}

main()
{
    unsigned int n;
    scanf("%d", &n);
    printf("%u\n", f(n));
}
查看答案与解析

答案:

  • 第一空:unsigned int f(unsigned int num)f(num)
  • 第二空:num % 10
  • 第三空:numnum != 0

解析: 通过取余和整除分离各位数字,累加求和。


难度: ⭐⭐
考点: #数位分离 #函数

💡 学习锦囊

📖 相关公式与知识点:

  • 取个位:num % 10
  • 去掉个位:num / 10

思路分析

用循环逐位分离并累加。

🔄 举一反三
  1. 如何求一个整数的位数?
    查看练习答案与解析

    答案int count = 0; while (num) { count++; num /= 10; }解析:每次除以 10 去掉一位,计数器加 1。

(3) 为数组输入数据,逆序置换后输出。

c
#define N 8
main()
{
    int i, j, t, a[N];
    for (i = 0; i < N; i++)
        scanf("%d", a + i);
    
    i = 0; j = N - 1;
    while (i < j)
    {
        t = *(a + i);
        *(a + i) = *(a + j);  /* 第一空 */
        *(a + j) = t;  /* 第二空 */
        i++;  /* 第三空 */
        j--;
    }
    for (i = 0; i < N; i++)
        printf("%5d", *(a + i));
}
查看答案与解析

答案:

  • 第一空:*(a + j)
  • 第二空:*(a + j) = t
  • 第三空:i++(或 ++i

解析: 双指针法:i 从头,j 从尾,交换元素,向中间移动。


难度: ⭐⭐
考点: #数组逆序 #双指针

💡 学习锦囊

📖 相关公式与知识点:

  • 逆序:首尾交换,向中间靠拢。
  • 终止条件:i >= j

思路分析

注意循环终止条件和指针移动。

🔄 举一反三
  1. 如何用单指针实现数组逆序?
    查看练习答案与解析

    答案:用 for (i = 0; i < N/2; i++) 交换 a[i]a[N-1-i]解析:只需遍历一半,用下标计算对称位置。

五、程序设计题(第29小题7分,第30小题各10分,共17分)

(1) 将 100 个整数输入数组后按每行 10 个数输出。

查看答案与解析

参考答案:

c
#include <stdio.h>

main()
{
    int a[100], i;
    
    /* 输入 */
    printf("请输入100个整数:\n");
    for (i = 0; i < 100; i++)
        scanf("%d", &a[i]);
    
    /* 输出,每行10个 */
    for (i = 0; i < 100; i++)
    {
        printf("%5d", a[i]);
        if ((i + 1) % 10 == 0)
            printf("\n");
    }
}

解析: 用循环控制输出格式,每输出 10 个数换一行。(i + 1) % 10 == 0 判断是否换行。


难度: ⭐⭐
考点: #数组 #格式化输出

💡 学习锦囊

📖 相关公式与知识点:

  • 换行条件:(i + 1) % n == 0

思路分析

注意 i 从 0 开始,所以用 (i + 1) % 10 判断。

🔄 举一反三
  1. 如何每行输出 5 个数,每个数占 8 列宽度?
    查看练习答案与解析

    答案printf("%8d", a[i]); if ((i + 1) % 5 == 0) printf("\n");解析:修改宽度和每行个数即可。

(2) 计算 e = 1 + 1/1! + 1/2! + ... + 1/n! 的值并输出(设 n=20)。

查看答案与解析

参考答案:

c
#include <stdio.h>

main()
{
    int n = 20, i;
    double e = 1.0, factorial = 1.0;
    
    for (i = 1; i <= n; i++)
    {
        factorial *= i;  /* i! */
        e += 1.0 / factorial;
    }
    
    printf("e = %.15f\n", e);
}

解析: 利用递推关系:n! = n × (n-1)!,避免重复计算。


难度: ⭐⭐⭐
考点: #阶乘 #级数求和

💡 学习锦囊

📖 相关公式与知识点:

  • e 的泰勒展开:e = Σ(1/n!)
  • 递推计算阶乘,避免溢出和重复计算。

思路分析

用递推法计算阶乘,注意使用 double 类型。

易错点

  • int 阶乘会溢出,用 double 存储。
  • 除法要用 1.0 / factorial 而非 1 / factorial
🔄 举一反三
  1. 如何计算 sin(x) 的泰勒展开?
    查看练习答案与解析

    答案

    c
    double sin_x = x, term = x;
    for (i = 1; i <= n; i++)
    {
        term *= -x * x / ((2*i) * (2*i + 1));
        sin_x += term;
    }

    解析:利用递推关系计算每一项。

你正在阅读的是会员专属文档,💕 限时特惠进行中
你尚未登录,目前新用户可获3天体验会员,去登录